class Warter {
  //#region static constant
  /**
   * #### 大气压力，单位KPa
   */
  static readonly ATMOSPHERIC_PRESSURE = 101.325;

  /**
   * #### 水的比热容，单位KJ/(Kg·℃)
   */
  static readonly SPECIFIC_HEAT = 4.1868;

  /**
   * #### 标准大气压下，水的汽化潜热，单位KJ/Kg
   */
  static readonly LATENT_HEAT = 2260;

  /**
   * ####  标准大气压下，水的凝固点，单位℃
   */
  static readonly MELTING_POINT = 0;

  /**
   * ####  标准大气压下，水的沸点，单位℃
   */
  static readonly BOILING_POINT = 100;

  /**
   * #### 标准大气压下，水的最大密度，单位Kg/m³，4℃水的密度最高
   */
  static readonly DENSITY_MAX = 999.972;

  /**
   * #### 水的饱和蒸汽压，单位KPa
   */
  static readonly SATURATION_VAPOR_PRESSURE = 0.6112;

  /**
   * #### 水的标准温差，单位℃
   */
  static readonly DIFFERENCE_TEMPERATURE = 5;

  /**
   * #### 流量单位为：m³/h时，水的热量计算常数，默认值为1.163;
   */
  static readonly HEAT_CAPACITY_CONTANT =
    (Warter.SPECIFIC_HEAT * Warter.DENSITY_MAX) / 3600;
  //#endregion

  temperature: number;
  constructor(temperature = 20) {
    this.temperature = temperature;
  }

  /**
   * #### 水的密度，单位Kg/m³
   * @param temperature 温度，单位：℃
   * @returns
   */
  static calcDensity(temperature: number) {
    if (temperature < 0 || temperature > 100) {
      throw new Error("温度范围在0-100之间");
    }
    if (temperature < 4) {
      return 999.84 + temperature * 0.005;
    }
    if (temperature === 4) {
      return Warter.DENSITY_MAX;
    }
    return Warter.DENSITY_MAX - (temperature - 4) * 0.0002;
  }

  /**
   * #### 计算水加热(制冷)所需的热量，温差默认5℃；
   * 返回值为热量，单位：KW
   * @param volumetricFlow 体积流量，单位：m3/h
   */
  static calcHeat(volumetricFlow: number): number;
  /**
   * #### 计算水加热(制冷)所需的热量；
   * 返回值为热量，单位：KW
   * @param volumetricFlow 体积流量，单位：m3/h
   * @param difT 温差，单位：℃
   */
  static calcHeat(volumetricFlow: number, difT: number): number;
  /**
   * #### 计算水加热(制冷)所需的热量;
   * 返回值为热量，单位：KW
   * @param volumetricFlow 体积流量，单位：m3/h
   * @param t1 进水的温度，单位：℃
   * @param t2 出水温度，单位：℃
   */
  static calcHeat(volumetricFlow: number, t1: number, t2: number): number;
  static calcHeat(
    volumetricFlow: number,
    params1?: number,
    params2?: number
  ): number {
    if (params1 && params2) {
      const max = Math.max(params1, params2);
      const min = Math.min(params1, params2);
      return (
        (volumetricFlow *
          Warter.SPECIFIC_HEAT *
          (Warter.calcDensity(max) * max - Warter.calcDensity(min) * min)) /
        3600
      );
    }

    return params1
      ? Warter.HEAT_CAPACITY_CONTANT * volumetricFlow * params1
      : Warter.HEAT_CAPACITY_CONTANT *
          Warter.DIFFERENCE_TEMPERATURE *
          volumetricFlow;
  }
}

export default Warter;

// const temps = [0, 10, 20, 30, 40];
// function toH(t: number) {
//   return (t * 9) / 5 + 32; // 华氏度
// }

// const f_temps = temps.map((t) => toH(t));
